import { lazyReportBatch } from '../report.js';

export default function error () {
    // 捕获资源加载错误：js，css，img
    window.addEventListener('error',function(e) {
        const target = e.target;
        if(!target) {// 说明不是js，css，img加载错误,应该是纯js运行的错误
            // event.target 是触发事件的 DOM 元素。
            // 对于资源加载错误（例如图片、脚本、样式表加载失败），event.target 会指向加载失败的资源元素（例如 <img>、<script>、<link> 等）。
            // 对于 JavaScript 运行时错误（例如未定义的函数调用、语法错误等），event.target 为 null 或 undefined，因为这些错误没有关联的 DOM 元素。
            return;
        }
        if(target.src || target.href) {
            const url = target.src || target.href;
            const reportData = {
                type:"error",
                subType:"resource",
                url,
                html:target.outerHTML,
                pageUrl:window.location.href,
                path:e.path
            }
            // todo:发送数据
            lazyReportBatch(reportData);

        }
    },true);

    // 捕获js错误
    window.onerror = function(msg,url,lineNo,colNo,error) {
        const reportData = {
            type:"error",
            subType:"js",
            msg,
            url,
            lineNo,
            colNo,
            stack: error.stack,
            pageUrl:window.location.href,
            startTime: performance.now(),
            
        }
        // 发送数据
        lazyReportBatch(reportData);

    }

    // 捕获promise、async await错误
    window.addEventListener('unhandledrejection',function(e) {
        const reportData = {
            type:"error",
            subType:"promise",
            reason:e.reason?.stack,
            pageUrl:window.location.href,
            startTime:e.timeStamp
        }
        // 发送数据
        lazyReportBatch(reportData);


    }, true);

}